"""例：使用Condition对象实现线程同步，模拟生产者与消费者问题。在代码中
使用列表模拟物品池，生产者往里放置东西，而消费者从池中获取物品。物品池满时
生产者等待，空时消费者等待。"""
import threading
import time


# 自定义生产者线程类
class Producer(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name=threadname)

    def run(self):
        while True:
            time.sleep(1)  # 生产者生产间隔，可按需调整
            con.acquire()  # 获取锁
            x.append("product")  # 模拟生产一个产品，添加到列表
            print(f'Produced: product, x={x}')
            con.notify()  # 通知消费者
            con.release()  # 释放锁


# 自定义消费者线程类
class Consumer(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name=threadname)

    def run(self):
        while True:
            time.sleep(3)  # 消费者消费间隔，可按需调整
            con.acquire()  # 获取锁
            if not x:
                print('Consumer is waiting.....')  # 等待
                con.wait()
            else:
                t = x.pop(0)
                print(f'Consumed:{t},x={x}')
                con.notify()
            con.release()


# 创建 Condition 对象以及生产者线程和消费者线程
con = threading.Condition()
x = []
p = Producer('Producer')
c = Consumer('Consumer')
p.start()
c.start()